package net.xdclass.util;

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

public class SpringBeanUtil {
    /**
     * 把源对象的属性值复制到目标对象中。
     * 该方法通过反射创建目标对象的实例，并使用BeanUtils的copyProperties方法将源对象的属性值复制到新创建的目标对象中。
     * 这样做的目的是为了在不改变原有对象的情况下，创建一个具有相同属性值的新对象。
     *
     * @param source 源对象，其属性值将被复制。
     * @param target 目标对象的Class，用于创建新对象并复制属性值。
     * @param <T>    目标对象的类型参数。
     * @return 新创建的并已填充了属性值的目标对象。
     * @throws RuntimeException 如果在创建目标对象实例或复制属性过程中发生异常。
     */
    public static <T> T copyProperties(Object source, Class<T> target) {
        try {
            // 通过反射无参构造方法创建目标对象的实例
            T t = target.getConstructor().newInstance();
            // 使用BeanUtils的copyProperties方法复制源对象的属性到目标对象
            BeanUtils.copyProperties(source, t);
            return t;
        } catch (Exception e) {
            // 捕获并抛出运行时异常，以方便调用方处理异常情况
            throw new RuntimeException(e);
        }
    }


    /**
     * 复制属性值到新的对象列表。
     * 该方法通过遍历源对象列表，将每个源对象的属性值复制到新建的目标对象中，然后将这些目标对象添加到一个新的列表中返回。
     * 这种方式适用于需要根据已有对象列表创建一个新的具有相同属性的对象列表的场景。
     *
     * @param sourceList 源对象列表，可以包含任意类型的对象。
     * @param target 目标对象的类类型，用于创建新的目标对象。
     * @param <T> 目标对象的类型参数。
     * @return 包含复制了属性值的新对象的列表。
     */
    public static <T> List<T> copyProperties(List<?> sourceList, Class<T> target) {
        // 初始化目标对象列表
        ArrayList<T> targetList = new ArrayList<>();
        // 遍历源对象列表，对每个源对象进行属性复制操作
        sourceList.forEach(item -> targetList.add(copyProperties(item, target)));
        // 返回包含复制了属性值的新对象的列表
        return targetList;
    }

}